package com.bcmusic.order.service.impl;

import com.bcmusic.music.pojo.Music;
import com.bcmusic.order.dao.OrderDetailMapper;
import com.bcmusic.order.pojo.OrderCart;
import com.bcmusic.order.pojo.OrderDetail;
import com.bcmusic.order.service.OrderDetailService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import entity.BCrypt;
import entity.DateUtil;
import entity.Page;
import org.aspectj.weaver.ast.Or;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import tk.mybatis.mapper.entity.Example;

import javax.swing.plaf.nimbus.NimbusLookAndFeel;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/****
 * @Author:admin
 * @Description:OrderDetail业务层接口实现类
 * @Date 2019/6/14 0:16
 *****/
@Service
public class OrderDetailServiceImpl implements OrderDetailService {

    @Autowired
    private OrderDetailMapper orderDetailMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * OrderDetail条件+分页查询
     * @param orderDetail 查询条件
     * @param page 页码
     * @param size 页大小
     * @return 分页结果
     */
    @Override
    public PageInfo<OrderDetail> findPage(OrderDetail orderDetail, int page, int size){
        //分页
        PageHelper.startPage(page,size);
        //搜索条件构建
        Example example = createExample(orderDetail);
        //执行搜索
        return new PageInfo<OrderDetail>(orderDetailMapper.selectByExample(example));
    }

    /**
     * OrderDetail分页查询
     * @param page
     * @param size
     * @return
     */
    @Override
    public PageInfo<OrderDetail> findPage(int page, int size){
        //静态分页
        PageHelper.startPage(page,size);
        //分页查询
        return new PageInfo<OrderDetail>(orderDetailMapper.selectAll());
    }

    /**
     * OrderDetail条件查询
     * @param orderDetail
     * @return
     */
    @Override
    public List<OrderDetail> findList(OrderDetail orderDetail){
        //构建查询条件
        Example example = createExample(orderDetail);
        //根据构建的条件查询数据
        return orderDetailMapper.selectByExample(example);
    }


    /**
     * OrderDetail构建查询对象
     * @param orderDetail
     * @return
     */
    public Example createExample(OrderDetail orderDetail){
        Example example=new Example(OrderDetail.class);
        Example.Criteria criteria = example.createCriteria();
        if(orderDetail!=null){
            // 订单详情id。
            if(!StringUtils.isEmpty(orderDetail.getOrderDetailId())){
                criteria.andEqualTo("orderDetailId",orderDetail.getOrderDetailId());
            }
            // 音乐订单编号。关联order表的order_number字段。
            if(!StringUtils.isEmpty(orderDetail.getOrderId())){
                criteria.andEqualTo("orderId",orderDetail.getOrderId());
            }
            // 音乐作品编号。关联music表的music_number字段。
            if(!StringUtils.isEmpty(orderDetail.getMusicNumber())){
                criteria.andEqualTo("musicNumber",orderDetail.getMusicNumber());
            }
            // 授权类型。即被授权方选择的需要的授权类型。（暂定）00为非商业授权，01为商业授权，02为两者都选。
            if(!StringUtils.isEmpty(orderDetail.getAuthorizationType())){
                criteria.andEqualTo("authorizationType",orderDetail.getAuthorizationType());
            }
            // 授权区域。即被授权方选择的需要的授权区域。（暂定）00为国内区域，01为国外区域，02为两者都选。
            if(!StringUtils.isEmpty(orderDetail.getAuthorizationRegion())){
                criteria.andEqualTo("authorizationRegion",orderDetail.getAuthorizationRegion());
            }
            // 授权开始时间。即被授权方选择的需要的开始授权时间。不可早于下订单的时间。
            if(!StringUtils.isEmpty(orderDetail.getAuthorizationStartTime())){
                criteria.andEqualTo("authorizationStartTime",orderDetail.getAuthorizationStartTime());
            }
            // 授权结束时间。即被授权方选择的需要的授权结束时间。不可早于下订单的时间。
            if(!StringUtils.isEmpty(orderDetail.getAuthorizationEndTime())){
                criteria.andEqualTo("authorizationEndTime",orderDetail.getAuthorizationEndTime());
            }
            // 授权单价（元/天）。
            if(!StringUtils.isEmpty(orderDetail.getPricePerDay())){
                criteria.andEqualTo("pricePerDay",orderDetail.getPricePerDay());
            }
            // 单曲支付金额。
            if(!StringUtils.isEmpty(orderDetail.getPayMoney())){
                criteria.andEqualTo("payMoney",orderDetail.getPayMoney());
            }
            // 单曲优惠金额。
            if(!StringUtils.isEmpty(orderDetail.getDiscountMoney())){
                criteria.andEqualTo("discountMoney",orderDetail.getDiscountMoney());
            }
            // 单曲MB积分。即被授权方完成购买该单曲的交易可获得MB积分回馈。
            if(!StringUtils.isEmpty(orderDetail.getMbPoint())){
                criteria.andEqualTo("mbPoint",orderDetail.getMbPoint());
            }
            //
            if(!StringUtils.isEmpty(orderDetail.getUserNumber())){
                criteria.andEqualTo("userNumber",orderDetail.getUserNumber());
            }
            // 0为已过期，1为未过期
            if(!StringUtils.isEmpty(orderDetail.getStatus())){
                criteria.andEqualTo("status",orderDetail.getStatus());
            }
        }
        return example;
    }

    /**
     * 删除
     * @param id
     */
    @Override
    public void delete(Integer id){
        orderDetailMapper.deleteByPrimaryKey(id);
    }

    /**
     * 修改OrderDetail
     * @param orderDetail
     */
    @Override
    public void update(OrderDetail orderDetail){
        orderDetailMapper.updateByPrimaryKey(orderDetail);
    }

    /**
     * 增加OrderDetail
     * @param orderDetail
     */
    @Override
    public void add(OrderDetail orderDetail){
        orderDetailMapper.insert(orderDetail);
    }

    /**
     * 根据ID查询OrderDetail
     * @param id
     * @return
     */
    @Override
    public OrderDetail findById(Integer id){
        return  orderDetailMapper.selectByPrimaryKey(id);
    }

    /**
     * 查询OrderDetail全部数据
     * @return
     */
    @Override
    public List<OrderDetail> findAll() {
        return orderDetailMapper.selectAll();
    }

    /**
     * 时间紧急先用for循环插入，批量插入没有解决返回id问题 未测试
     * @param orderCartList
     * @param orderId
     * @return
     */
    @Override
    public List<OrderDetail> finishOrder(List<OrderCart> orderCartList,Integer orderId) {

//        List<OrderDetail> orderDetailList=new ArrayList<>();
//        //每件付的钱
//        Map<Integer,String>perPay = (Map<Integer,String>)redisTemplate.boundHashOps(orderId ).get(orderId+"_perPay");
//        //每件折扣价格
//        Map<Integer,String>perDis = (Map<Integer,String>)redisTemplate.boundHashOps(orderId ).get(orderId+"_perDis");
//
//        //TODO 出现异常如何处理
//        List<OrderDetail>details=new ArrayList<>();
//        for (int i = 0; i < orderCartList.size(); i++) {
//            OrderDetail orderDetail=new OrderDetail();
//            orderDetail.setOrderId(orderId);
//            orderDetail.setMusicNumber(orderCartList.get(i).getMusicNumber());
//            orderDetail.setAuthorizationType(orderCartList.get(i).getAuthorizationType());
//            orderDetail.setAuthorizationRegion(orderCartList.get(i).getAuthorizationRegion());
//            orderDetail.setAuthorizationStartTime(orderCartList.get(i).getAuthorizationStartTime());
//            orderDetail.setAuthorizationEndTime(orderCartList.get(i).getAuthorizationEndTime());
//            orderDetail.setPricePerDay(orderCartList.get(i).getPricePerDay());
//            //这个字段没有考虑到，先为空
//            orderDetail.setPayMoney(perPay.get(orderCartList.get(i).getOrderCartId()));
//            orderDetail.setDiscountMoney(perDis.get(orderCartList.get(i).getOrderCartId()));
//            orderDetail.setMbPoint(null);
//            orderDetail.setUserNumber(orderCartList.get(i).getUserNumber());
//            orderDetail.setStatus(1);
//
//            details.add(orderDetail);
//        }
//        int i = orderDetailMapper.insertList(details);
//        return details;
        return null;
    }

    @Override
    public String getCertificate(String userNum, OrderDetail orderDetail, Music music) {

//        //如果不是该用户购买，则不回授权信息
//        if(!orderDetail.getUserNumber().equals(userNum))
//        {
//            return null;
//        }
//        //过期不给
//        if(orderDetail.getStatus().equals(0))
//        {
//            return null;
//        }
//        StringBuffer stringBuffer=new StringBuffer();
//        stringBuffer.append(new String(music.getMusicMaker()));
//        stringBuffer.append("的");
//        stringBuffer.append(music.getMusicName());
//        stringBuffer.append("歌曲于");
//        stringBuffer.append(DateUtil.data2str(orderDetail.getAuthorizationEndTime(),DateUtil.PATTERN_YYYY_MM_DD));
//        //TODO
//        stringBuffer.append("正式授权给");
//        stringBuffer.append(userNum+"用户，");
//
//        Integer buffer = orderDetail.getAuthorizationType();
//        //严格来说str不能变，但是它会自动指向一个新的对象
//        String str= "";
//        switch (buffer){
//            case 0:
//                str="非商业授权";
//                break;
//            case 1:
//                str="商业授权";
//                break;
//            case 2:
//                str="商业授权和非商业授权";
//                break;
//            default:
//                break;
//        }
//        stringBuffer.append("授权类型为"+str);
//        buffer=orderDetail.getAuthorizationRegion();
//        switch (buffer)
//        {
//            case 0:
//                str="国内地区";
//                break;
//            case 1:
//                str="国外地区";
//                break;
//            case 2:
//                str="国内以及国外地区";
//            default:
//                break;
//        }
//        stringBuffer.append("授权地域为"+str);
//        stringBuffer.append("授权自"+DateUtil.data2str(orderDetail.getAuthorizationStartTime(),DateUtil.PATTERN_YYYY_MM_DD));
//        stringBuffer.append("至"+DateUtil.data2str(orderDetail.getAuthorizationEndTime(),DateUtil.PATTERN_YYYY_MM_DD)+"有效,");
//
//        BCryptPasswordEncoder bCryptPasswordEncoder=new BCryptPasswordEncoder();
//        String encode = bCryptPasswordEncoder.encode(userNum+String.valueOf(orderDetail.getOrderId()));
//        stringBuffer.append("授权码为"+encode+"。");
//        return stringBuffer.toString();
        return null;
    }


}
